package aplicacion;

import java.io.File;
import java.io.FileFilter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

import excepciones.ExcepcionAgendaVacia;
import excepciones.ExcepcionEntradaNoEncontrada;

import aplicacion.util.GeneradorXML;

//Falta refactorizar muuuuuucho :)
//Clean code that works -> tenemos la segunda parte

public class Menu {
    private AgendaEx agenda;
    private final static String fichero = "/home/senda/Escritorio/agenda.xml";

    private enum OpcionesMenu {
	SALIR, LISTAR, BUSCARN, ANYADIRP, ANYADIRE, IMPRIMIR, BUSCARD, GUARDAR
    }

    private Menu() {
	agenda = new AgendaEx();
    }

    private void ejecuta() throws ExcepcionAgendaVacia, IOException {
	String opcion;
	
	cargarXML();
	
	Scanner sc = new Scanner(System.in);
	
	try {
	    OpcionesMenu opcionmenu;
	    do {
		imprimeMenu();

		opcion = sc.nextLine();
		opcionmenu = OpcionesMenu.values()[Integer.parseInt(opcion)];

		switch (opcionmenu) {
		case LISTAR:
		    muestraEntradas();
		    break;
		case BUSCARN:
		    buscarEntrada();
		    break;
		case ANYADIRP:
		    anyadirEntrada("p");
		    break;
		case ANYADIRE:
		    anyadirEntrada("e");
		    break;
		case IMPRIMIR:
		    String xml = generarXML();
		    System.out.println(xml);
		    break;
		case BUSCARD:
		    buscarEntradaDireccion();
		    break;
		case GUARDAR:
		    guardarAgenda();
		    break;
		}
	    } while (opcionmenu != OpcionesMenu.SALIR);
	} catch (NumberFormatException e) {
	    System.out.println("Opcion invalida");
	    return;
	}
    }
    
    public void cargarXML() {
	XML nuevo = new XML();
	
	ArrayList<String[]> res = nuevo.leer(fichero);
	
	for(String[] e:res) {
	    agenda.anyadir(new PersonaEx(e[0],e[1],"","",""));
	}
    }
    
    public void guardarAgenda() throws ExcepcionAgendaVacia, IOException {
	String xml = generarXML();
	File f = new File(fichero);
	FileWriter fw = new FileWriter(f);
	fw.write(xml);
	fw.close();
    }

    public void imprimeMenu() {
	System.out.println("MI AGENDA");
	System.out.println("**************************");
	System.out
		.println(OpcionesMenu.LISTAR.ordinal() + " - Listar entradas");
	System.out
		.println(OpcionesMenu.BUSCARN.ordinal() + " - Buscar entrada");
	System.out.println(OpcionesMenu.ANYADIRP.ordinal()
		+ " - Anyadir persona");
	System.out.println(OpcionesMenu.ANYADIRE.ordinal()
		+ " - Anyadir empresa");
	System.out.println(OpcionesMenu.IMPRIMIR.ordinal() + " - Imprimir XML");
	System.out.println(OpcionesMenu.BUSCARD.ordinal()
		+ " - Buscar por direccion");
	System.out.println(OpcionesMenu.GUARDAR.ordinal() + " - Guardar");
	System.out.println(OpcionesMenu.SALIR.ordinal() + " - Salir");
	System.out.println("**************************");

	System.out.print("Que deseas hacer? : ");
    }

    public String generarXML() throws ExcepcionAgendaVacia {
	GeneradorXML xml = new GeneradorXML(agenda);
	return xml.getXML();
    }

    public String pedirDatos(String cad) {
	Scanner sc = new Scanner(System.in);
	System.out.print(cad + " : ");
	return sc.nextLine();
    }

    public void anyadirEntrada(String tipo) {
	Entrada p;
	String telefono = pedirDatos("Introduzca telefono");
	String nombre = pedirDatos("Introduzca nombre");
	String direccion = pedirDatos("Introduzca direccion");

	if (tipo.equals("p")) {
	    String apellidos = pedirDatos("Introduzca apellidos");
	    String edad = pedirDatos("Introduzca edad");
	    p = new PersonaEx(nombre, telefono, direccion, edad, apellidos);
	} else {
	    String empleados = pedirDatos("Introduzca numero de empleados");
	    p = new EmpresaEx(nombre, telefono, direccion, empleados);
	}

	agenda.anyadir(p);
    }

    public void muestraEntradas() {
	try {
	    ArrayList<Entrada> entradas = (ArrayList<Entrada>)agenda.listar();
	    for (Entrada e:entradas) {
		imprimeDatosEntrada(e);
	    }
	} catch(ExcepcionAgendaVacia e) {
	    System.out.println(e.getMessage());
	}
    }

    public void imprimeDatosEntrada(Entrada e) {
	System.out.println(e);
    }

    public void buscarEntrada() {
	String nombre = pedirDatos("Introduzca nombre a buscar");

	try {
	    Entrada e = agenda.buscar(nombre);
	    imprimeDatosEntrada(e);
	} catch (ExcepcionEntradaNoEncontrada e) {
	    System.out.println(e.getMessage());
	}
    }

    public void buscarEntradaDireccion() {
	String direccion = pedirDatos("Introduzca direccion a buscar");

	try {
	    Entrada e = agenda.buscarDireccion(direccion);
	    imprimeDatosEntrada(e);
	} catch (ExcepcionEntradaNoEncontrada e) {
	    System.out.println(e.getMessage());
	}
    }

    public static void main(String[] args) throws ExcepcionAgendaVacia, IOException {
	new Menu().ejecuta();
    }
}
